﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace Common.Utils {
  public class MD5Util {

    private static log4net.ILog _logger = log4net.LogManager.GetLogger(typeof(MD5Util));

    /// <summary>  
    /// 获取文件的MD5码  
    /// </summary>  
    /// <param name="fileName">传入的文件名（含路径及后缀名）</param>  
    /// <returns></returns>  
    public static string GetMD5HashFromFile(string fileName) {
      try {
        FileStream file = new FileStream(fileName, System.IO.FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] retVal = md5.ComputeHash(file);
        file.Close();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < retVal.Length; i++) {
          sb.Append(retVal[i].ToString("X2"));
        }
        return sb.ToString();
      } catch (Exception exception) {
        _logger.Error(exception);
        throw exception;
      }
    }


    /// <summary>
    /// 获取字符串的MD5码
    /// </summary>
    /// <param name="input">输入字符串</param>
    /// <returns></returns>
    public static string CreateMD5Hash(string input) {
      MD5 md5 = System.Security.Cryptography.MD5.Create();
      byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
      byte[] hashBytes = md5.ComputeHash(inputBytes);
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < hashBytes.Length; i++) {
        sb.Append(hashBytes[i].ToString("X2"));
      }
      return sb.ToString();
    }
  }
}
